/**
 * 测试非阻塞式IO
*/

#include "utilty.h"
#include <vector>
#include <cstdio>
#include <cerrno>
#include <cstring>
#include <unistd.h>

using namespace std;

constexpr int READ_BUFFER_SIZE = 1024;

int main() {
    vector<func_t> call_backs;
    initTasks(call_backs);

    setNonBlock(stdin->_fileno); // 将标准输入设定为非阻塞状态
    char buffer[READ_BUFFER_SIZE] = {};

    for (;;) {
        ssize_t n = read(stdin->_fileno, buffer, READ_BUFFER_SIZE - 1);
        if (n > 0) { 
            // @成功读到数据

            buffer[n - 1] = '\0'; // 将'\n'改成'\0'
            cout << "echo# " << buffer << endl;
        }
        else if(n == 0) {
            // @读取到EOF

            cout << "read end" << endl;
            break; // 读到文件结尾就退出循环for (;;)
        }
        else {
            // @出现其他情况, 如非阻塞状态没有读到数据时返回、在读取过程中被OS中断、真的出错了
            // *可以用errno来区分上面的情况，虽然它们的返回值都是-1，但是设置的错误码不同

            if (errno == EAGAIN) {
                // @非阻塞状态没有读到数据时返回

                cout << "Sorry, there is no data" << endl;

                // 在非阻塞的等待数据准备的过程中，我们可以做一些其他的事情，这是非阻塞IO的好处和特点
                execTasks(call_backs);
            }
            else if (errno == EINTR) {
                // @在读取过程中被OS中断

                continue; // 退出本次循环，继续读取
            }
            else {
                // @真的出错了

                cout << "errno: " << errno << " description: " << strerror(errno) << endl;
                break;
            }
        }

        sleep(1);
        
    }// @end for (;;)

    return 0;
}